デダクション・ガイド

可能であれば、oneapi::tbb::concurrent_priority_queue コンストラクターは、クラス・テンプレート引数を推測することができます (C++17 以降)。コピーおよび移動コンストラクター (明示的な allocator_type 引数を持つコンストラクターを含む) は、暗黙的に生成されるデダクション・ガイドを提供します。さらに、次の明示的なデダクション・ガイドが提供されます。

template <typename InputIterator, 
          typename Compare = std::less<iterator_value_t<InputIterator>>, 
          typename Allocator = tbb::cache_aligned_allocator<iterator_value_t<InputIterator>>> 
concurrent_priority_queue( InputIterator, InputIterator, 
                           Compare = Compare(), 
                           Allocator = Allocator() ) 
-> concurrent_priority_queue<iterator_value_t<InputIterator>, 
                           Compare, 
                           Allocator>; 

template <typename InputIterator, 
          typename Allocator> 
concurrent_priority_queue( InputIterator, InputIterator, 
                           Allocator ) 
-> concurrent_priority_queue<iterator_value_t<InputIterator>, 
                           std::less<iterator_value_t<InputIterator>>, 
                           Allocator>; 

template <typename T, 
          typename Compare = std::less<T>, 
          typename Allocator = tbb::cache_aligned_allocator<T>> 
concurrent_priority_queue( std::initializer_list<T>, 
                           Compare = Compare(), 
                           Allocator = Allocator() ) 
-> concurrent_priority_queue<T, 
                          Compare, 
                          Allocator>; 

template <typename T, 
          typename Allocator> 
concurrent_priority_queue( std::initializer_list<T>, 
                           Allocator ) 
-> concurrent_priority_queue<T, 
                             std::less<T>, 
                             Allocator>;

ここで、 タイプエイリアス iterator_value_t は次のように定義されます:

template <typename InputIterator> 
using iterator_value_t = typename std::iterator_traits<InputIterator>::value_type;

このデダクション・ガイドは、次の要件が満たされる場合にのみ、オーバーロードの解決に関係します。

  • InputIterator タイプは、[input.iterators] ISO C++ 標準の InputIterator の要件を満たしている必要があります。

  • Allocator タイプは、[allocator.requirements ISO C++ 標準の Allocator の要件を満たしている必要があります。

  • Compare タイプは Allocator の要件を満たしていません。

#include <oneapi/tbb/concurrent_priority_queue.h> 
#include <vector> 
#include <functional> 

int main() { 
    std::vector<int> vec; 

    // Deduces cpq1 as oneapi::tbb::concurrent_priority_queue<int> 
    oneapi::tbb::concurrent_priority_queue cpq1(vec.begin(), vec.end()); 

    // Deduces cpq2 as oneapi::tbb::concurrent_priority_queue<int, std::greater> 
    oneapi::tbb::concurrent_priority_queue cpq2(vec.begin(), vec.end(), std::greater{}); 
}